#ifndef NOISEREDUCER_H
#define NOISEREDUCER_H

#include <pybind11/pybind11.h>
#include <pybind11/embed.h>  // For embedding Python
#include <pybind11/numpy.h>  // Ensure numpy support

#include <iostream>
#include <vector>

#include "conf.h"

namespace py = pybind11;

class NoiseReducer {
public:
    // 构造函数：初始化 Python 解释器并导入 noisereduce 库
    NoiseReducer() {
        try {
            // Initialize the Python interpreter
            py::scoped_interpreter guard{};

            // 导入 noisereduce 库一次
            noisereduce = py::module::import("noisereduce");
            
            sys_log("python interpreter init done.");

        } catch (const py::error_already_set& e) {
            std::cerr << "Python interpreter initialization failed: " << e.what() << std::endl;
            throw std::runtime_error("Python interpreter initialization failed");
        }
    }

    // 析构函数：不需要特别的清理操作，因为 py::scoped_interpreter 会自动管理
    ~NoiseReducer() {}

    // // 降噪函数：输入音频数据并返回降噪后的数据
    // std::vector<float> reduce_noise(const std::vector<float>& audio_data, int sample_rate) {
    //     try {
    //         // 将音频数据转换为 numpy 数组
    //         py::array_t<float> py_audio_data = py::array_t<float>(audio_data.size(), audio_data.data());

    //         // 调用 noisereduce 库的 reduce_noise 函数
    //         py::object result = noisereduce.attr("reduce_noise")(py_audio_data, sample_rate);

    //         // 获取降噪后的数据（假设它是一个 numpy 数组）
    //         py::array_t<float> denoised_data = result.cast<py::array_t<float>>();

    //         // 将降噪后的数据转换为 std::vector 并返回
    //         std::vector<float> denoised_audio(denoised_data.size());
    //         std::memcpy(denoised_audio.data(), denoised_data.data(), denoised_data.size() * sizeof(float));

    //         return denoised_audio;

    //     } catch (const py::error_already_set& e) {
    //         std::cerr << "Python error in noise reduction: " << e.what() << std::endl;
    //         throw std::runtime_error("Python error in noise reduction");
    //     }
    // }
    
    std::vector<float> reduce_noise(const float* audio_data, long int framesPerBuffer, int sample_rate) {
        try {
            // 将 float* 数据转换为 numpy 数组
            // py::array_t<float> py_audio_data({framesPerBuffer}, audio_data);

            // auto begin = py_audio_data.begin();
            // auto end = py_audio_data.end();

            // std::vector<float> vec(begin, end);

            // // 使用迭代器逐个复制元素
            // for (auto it = begin; it != end; ++it) {
            //     vec.push_back(*it);
            // }
    
            // // 调用 noisereduce 库的 reduce_noise 函数
            // // noisereduce = py::module::import("noisereduce");
            // py::object result = noisereduce.attr("reduce_noise")(py_audio_data, sample_rate);
    
            // // 获取降噪后的数据（假设它是一个 numpy 数组）
            // py::array_t<float> denoised_data = result.cast<py::array_t<float>>();
    
            // // 将降噪后的数据转换为 std::vector 并返回
            // std::vector<float> denoised_audio(denoised_data.size());
            // std::memcpy(denoised_audio.data(), denoised_data.data(), denoised_data.size() * sizeof(float));



            // std::vector<float> denoised_audio(py_audio_data.size());


            // std::memcpy(denoised_audio.data(), py_audio_data.data(), py_audio_data.size() * sizeof(float));

            // std::vector ve
    
            // return denoised_audio;
    
        } catch (const py::error_already_set& e) {
            std::cerr << "Python error in noise reduction: " << e.what() << std::endl;
            throw std::runtime_error("Python error in noise reduction");
        }
    }

    
private:
    py::module noisereduce;  // noisereduce 库作为成员变量，类初始化时只导入一次
};

#endif // NOISEREDUCER_H
